package com.qf.day06;

import com.qf.day07.modifier.sta.Constants;
import com.qf.day08.Flyable;

/**
 * Dog类继承 Animal类，在类名后面加关键字 extends 后面架上父类的名字
 *
 * 需要子类 写的是，子类特有的属性和方法
 *
 * implements 实现某个接口的关键字
 *
 * Comparable<> 的中括号里面要写的是，要比较的对象的类型
 * Dog对象要比较的对象的类型也是Dog
 *
 */
public class Dog extends Animal implements Comparable<Dog>, Flyable {

    private String vocal ;  // 叫声

    /**
     * 在子类的构造方法中，需要调用父类的构造方法，
     * 如果不明确写调用父类的哪个构造，那么编译器会默认添加调用父类的无参构造
     */
    public Dog() {
//        super();
//        super("小黄","牧羊犬","男",2);
        this.vocal = "旺旺";
    }

    public Dog(String vocal) {
        // 调用父类的无参构造
        super();
        this.vocal = vocal;
    }

    public Dog(String name, String type, String sex, int age, String vocal) {
        // 调用构造方法，父类的构造方法
        super(name, type, sex, age);
        this.vocal = vocal;
    }

    // 看家
    // 在实例方法中能访问的变量有哪些呢？
    // 变量有是三种：局部变量，实例变量，静态变量
    public void lookHouse(){
        System.out.println(getName()+"在看家:"+vocal);
        int hungry = this.getHungry();
        this.setHungry(hungry+1);
    }

    @Override
    public void eat() {
        System.out.println("========================");
        System.out.println(getName()+"在吃饭之前叫"+this.vocal);
        System.out.println(getName()+"开始吃饭了");
        int hungry = getHungry();
        setHungry(hungry-1);
        System.out.println("========================");
    }

    public String getVocal() {
        return vocal;
    }

    public void setVocal(String vocal) {
        this.vocal = vocal;
    }


    /**
     *         return "Dog{" +
     *                 "vocal='" + vocal + '\'' +
     *                 "} " + super.toString();
     * @return
     */
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + getName() + '\'' +
                ", type='" + getType() + '\'' +
                ", sex='" + getSex() + '\'' +
                ", age=" + getAge() +
                ", hungry=" + getHungry() +
                ", vocal='" + vocal + '\'' +
                '}';
    }

    /**
     * 接口中的方法需要在类中进行实现
     * 这个方法的目的，要比较两个dag对象的大小关系
     * 按照dog的年龄进行比较大小
     * @param o the object to be compared.
     * @return
     */
    @Override
    public int compareTo(Dog o) {

        // 获取当前dog的年龄
        int age = this.getAge();
        // 获取比较对象的年龄
        int targetAge = o.getAge();

        return age-targetAge;
    }

    @Override
    public void fly() {
        System.out.println("dog在aoao飞!!!!!!!");
    }
}
